package com.jackykeke.HBuilder.integrate;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Build;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import io.dcloud.EntryProxy;
import io.dcloud.common.DHInterface.IApp;
import io.dcloud.common.DHInterface.ICore;
import io.dcloud.common.DHInterface.IOnCreateSplashView;
import io.dcloud.common.DHInterface.ISysEventListener;
import io.dcloud.common.DHInterface.IWebview;
import io.dcloud.common.DHInterface.IWebviewStateListener;
import io.dcloud.common.util.BaseInfo;
import io.dcloud.common.util.ImageLoaderUtil;
import io.dcloud.feature.internal.sdk.SDK;

public class MainActivity extends AppCompatActivity {


    private LinearLayout pWebview;
    EntryProxy mEntryProxy = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

//        setContentView(R.layout.activity_main);
//        pWebview = (LinearLayout) findViewById(R.id.pWebview);

        if (mEntryProxy == null) {
//            FrameLayout rootView = new FrameLayout(this);
            // 创建5+内核运行事件监听
            WebappModeListener wm = new WebappModeListener(this, pWebview);
            // 初始化5+内核
            mEntryProxy = EntryProxy.init(this, wm);
            // 启动5+内核
            mEntryProxy.onCreate(this, savedInstanceState, SDK.IntegratedMode.WEBAPP, null);
//            setContentView(rootView);
//            setContentView(R.layout.activity_main);
        }


    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        return mEntryProxy.onActivityExecute(this, ISysEventListener.SysEventType.onCreateOptionMenu, menu);
    }


    @Override
    public void onPause() {
        super.onPause();
        mEntryProxy.onPause(this);
    }

    @Override
    public void onResume() {
        super.onResume();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && BaseInfo.mDeStatusBarBackground == -111111) {
            BaseInfo.mDeStatusBarBackground = getWindow().getStatusBarColor();
        }
        mEntryProxy.onResume(this);
    }


    public void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if (intent.getFlags() != 0x10600000) {// 非点击icon调用activity时才调用newintent事件
            mEntryProxy.onNewIntent(this, intent);
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mEntryProxy.onStop(this);
    }



    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        boolean _ret = mEntryProxy.onActivityExecute(this, ISysEventListener.SysEventType.onKeyDown, new Object[]{keyCode, event});
        return _ret ? _ret : super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        boolean _ret = mEntryProxy.onActivityExecute(this, ISysEventListener.SysEventType.onKeyUp, new Object[]{keyCode, event});
        return _ret ? _ret : super.onKeyUp(keyCode, event);
    }

    @Override
    public boolean onKeyLongPress(int keyCode, KeyEvent event) {
        boolean _ret = mEntryProxy.onActivityExecute(this, ISysEventListener.SysEventType.onKeyLongPress, new Object[]{keyCode, event});
        return _ret ? _ret : super.onKeyLongPress(keyCode, event);
    }

    public void onConfigurationChanged(Configuration newConfig) {
        try {
            int temp = this.getResources().getConfiguration().orientation;
            if (mEntryProxy != null) {
                mEntryProxy.onConfigurationChanged(this, temp);
            }
            super.onConfigurationChanged(newConfig);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        mEntryProxy.onActivityExecute(this, ISysEventListener.SysEventType.onActivityResult, new Object[]{requestCode, resultCode, data});
    }
}


class WebappModeListener implements ICore.ICoreStatusListener, IOnCreateSplashView {

    //    LinearLayout btns = null;
    Activity activity = null;
    ViewGroup mRootView = null;
    ProgressDialog pd = null;
    IApp app = null;


    public WebappModeListener(Activity activity, ViewGroup rootView) {
        this.activity = activity;
        mRootView = rootView;
//        btns = new LinearLayout(activity);
//        mRootView.setBackgroundColor(0xffffffff);
//        mRootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
//            @Override
//            public void onGlobalLayout() {
//                webview.onRootViewGlobalLayout(mRootView);
//            }
//        });
    }

    /**
     * 5+内核初始化完成时触发
     */
    @Override
    public void onCoreInitEnd(ICore coreHandler) {
        // 设置单页面集成的appid
        String appid = "TestAppid";//appid为null又是另一个界面了
        // 单页面集成时要加载页面的路径，可以是本地文件路径也可以是网络路径
//        String url = "file:///android_asset/apps/H5Plugin/www/index.html";
//        String url = "file:///android_asset/apps/eat/whatToEat.html";
//        String url = "file:///android_asset/apps/func/plus/camera.html";
        String url = "/apps/func";
        // 设置启动参数,可在页面中通过plus.runtime.arguments;方法获取到传入的参数
        String args = "{url:'http://www.baidu.com'}";

        // 启动启动独立应用的5+ Webapp
        app = SDK.startWebApp(activity, url, args, new IWebviewStateListener() {
            // 设置Webview事件监听，可在监监听内获取WebIvew加载内容的进度
            @Override
            public Object onCallBack(int pType, Object pArgs) {
                switch (pType) {
                    case IWebviewStateListener.ON_WEBVIEW_READY:
                        // WebApp准备加载事件
                        // 准备完毕之后添加webview到显示父View中，
                        // 设置排版不显示状态，避免显示webview时html内容排版错乱问题
                        View view = ((IWebview) pArgs).obtainApp().obtainWebAppRootView().obtainMainView();
                        view.setVisibility(View.VISIBLE);
//
                        if(view.getParent() != null){
                            ((ViewGroup)view.getParent()).removeView(view);
                        }
                        mRootView.addView(view, 0);
                        app.obtainWebAppRootView().obtainMainView().setVisibility(View.VISIBLE);

                        break;
                    case IWebviewStateListener.ON_PAGE_STARTED:
                        // 首页面开始加载事件
                        pd = ProgressDialog.show(activity, "加载中", "0/100");
                        break;
                    case IWebviewStateListener.ON_PROGRESS_CHANGED:
                        // WebApp首页面加载进度变化事件
                        if (pd != null) {
                            pd.setMessage(pArgs + "/100");
                        }
                        break;
                    case IWebviewStateListener.ON_PAGE_FINISHED:
                        // WebApp首页面加载完成事件
                        if (pd != null) {
                            pd.dismiss();
                            pd = null;
                        }
                        // 页面加载完毕，设置显示webview
                        app.obtainWebAppRootView().obtainMainView().setVisibility(View.VISIBLE);
//                        mRootView.addView( app.obtainWebAppRootView().obtainMainView(), 0);
                        break;
                }
                return null;
            }
        }, this);



        // 在Widget集成时如果不需要显示splash页面可按照如下步骤操作
        // 1 删除onCreateSplash方法内的代码
        // 2 将5+mainView添加到rootview时将页面设置为不可见
        // 3 在onCloseSplash方法中将5+mainView设置为可见
        // 4 修改androidmanifest.xml文件 将SDK_WebApp的主题设置为透明
        // 注意！
        // 如果不显示splash页面会造成用户点击后页面短时间内会没有变化，
        // 可能会给用户造成程序没响应的错觉，
        // 所以开发者需要对5+内核启动到5+应用页面显示之间的这段事件进行处理

        app.setIAppStatusListener(new IApp.IAppStatusListener() {
            // 设置APP运行事件监听
            @Override
            public boolean onStop() {
                // 应用运行停止时调用
                mRootView.removeView(app.obtainWebAppRootView().obtainMainView());
                // TODO Auto-generated method stub
                return false;
            }

            @Override
            public void onStart() {
                // 独立应用启动时触发事件
            }

            @Override
            public void onPause(IApp arg0, IApp arg1) {
                // WebApp暂停运行时触发事件
            }

            @Override
            public String onStoped(boolean arg0, String arg1) {
                // TODO Auto-generated method stub
                return null;
            }
        });


//        webview = SDK.createWebview(activity, url, appid, new IWebviewStateListener() {
//            @Override
//            public Object onCallBack(int pType, Object pArgs) {
//                switch (pType) {
//                    case IWebviewStateListener.ON_WEBVIEW_READY:
//                        // 准备完毕之后添加webview到显示父View中，设置排版不显示状态，避免显示webview时，html内容排版错乱问题
//                        ((IWebview) pArgs).obtainFrameView().obtainMainView().setVisibility(View.INVISIBLE);
//                        SDK.attach(mRootView, ((IWebview) pArgs));
//                        break;
//                    case IWebviewStateListener.ON_PAGE_STARTED:
//                        // 首页面开始加载事件
//                        break;
//                    case IWebviewStateListener.ON_PROGRESS_CHANGED:
//                        // 首页面加载进度变化
//                        break;
//                    case IWebviewStateListener.ON_PAGE_FINISHED:
//                        // 页面加载完毕，设置显示webview
//                        webview.obtainFrameView().obtainMainView().setVisibility(View.VISIBLE);
//                        break;
//                }
//                return null;
//            }
//        });
//
//        final WebView webviewInstance = webview.obtainWebview();
//        // 监听返回键
//        webviewInstance.setOnKeyListener(new View.OnKeyListener() {
//            @Override
//            public boolean onKey(View v, int keyCode, KeyEvent event) {
//                if (keyCode == KeyEvent.KEYCODE_BACK) {
//                    if (webviewInstance.canGoBack()) {
//                        webviewInstance.goBack();
//                        return true;
//                    }
//                }
//                return false;
//            }
//        });


    }

    // 5+SDK 开始初始化时触发
    @Override
    public void onCoreReady(ICore coreHandler) {
        try {
            // 初始化5+ SDK，
            // 5+SDK的其他接口需要在SDK初始化后才能調用
            SDK.initSDK(coreHandler);
            // 当前应用可使用全部5+API
            SDK.requestAllFeature();
            ImageLoaderUtil.initImageLoaderL(activity);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * // 通过代码注册扩展插件的示例
     * private void regNewApi() {
     * // 扩展插件在js层的标识
     * String featureName = "T";
     * // 扩展插件的原生类名
     * String className = "com.HBuilder.integrate.webview.WebViewMode_FeatureImpl";
     * // 扩展插件的JS层封装的方法
     * String content = "(function(plus){function test(){return plus.bridge.execSync('T','test',[arguments]);}plus.T = {test:test};})(window.plus);";
     * // 向5+SDK注册扩展插件
     * SDK.registerJsApi(featureName, className, content);
     * }
     **/

    @Override
    public boolean onCoreStop() {
        // TODO Auto-generated method stub
        // 当返回false时候回关闭activity
        return false;
    }


    @Override
    public Object onCreateSplash(Context context) {
        return null;
    }

    @Override
    public void onCloseSplash() {
        // 如果不需要显示spalsh页面将此行代码移动至onCloseSplash事件内
        app.obtainWebAppRootView().obtainMainView().setVisibility(View.VISIBLE);
    }
}